在上篇 Day21 淬鍊之章-多檔案上傳 ETL 流程-實作篇1 中,我們設計了一個 EventBridge 定期排程觸發 Lambda 並呼叫 Glue Workflow,今天要實際驗證這個排程是否如預期運作,並在最後加入 SNS 通知機制,讓系統能自動回報「成功或失敗」的執行狀態。
在驗證 Lambda 是否成功運作之前,我們先來簡單的介紹一下 Lambda 和 CloudWatch 之間的關係。
print()
、logger.info()
等)每個 Lambda 函數在建立時,AWS 會自動建立對應的 Log Group,例如:
/aws/lambda/check_files_and_trigger_workflow
每次 Lambda 被觸發時,都會自動產生一條 Log Stream,記錄:
print
或 logger
)👉 因此,我們可以透過 CloudWatch 直接觀察 Lambda 是否被 EventBridge 成功觸發、
執行結果如何,以及是否正確呼叫 Glue Workflow。
根據下圖我們可以看到該 Lambda 的執行狀況,已有成功檢查到
✅ Found: Bronze/ratings/2025-10-06/ratings.csv
✅ Found: Bronze/ratings/2025-10-06/ratings.csv
並且有實際去呼叫一個 Glue Workflow:Started Glue Workflow: wr_aa1c928fc88c3fba1f69651f69df83f5ec4998e4f3ddfdfa8f3bb5d45ba55f31
wf_animes_summary
串接的相關 Glue Job 都有成功被執行。經以上驗證後,即可確認到排程是有正常被啟動,並呼叫目標 Lambda。
在測試階段時,其實是可以將 EventBridge 調整成每 1-5 分鐘執行一次,加快驗證速度。
在完成 EventBridge + Lambda 自動排程後,我們希望能在 Lambda 執行成功或失敗時,立即收到通知信件。這時候,就能使用 AWS 的 SNS(Simple Notification Service)。
Amazon SNS 是一個「發佈/訂閱式(Pub/Sub)」的訊息服務,可讓多個應用程式透過主題(Topic)傳遞訊息給不同接收者(Email、SMS、Lambda、HTTP 等)。
在這個場景中,我們會讓:Lambda 成功或失敗時 → 呼叫 SNS → SNS 發送 Email 給你。
接下來我們來實際建立 SNS。
Step1:一樣在使用任何服務之前,我們都要先建立此服務的 Policy
,由於我們也是需要使用 Lambda 來觸發 SNS 服務,所以首先我們要先將 SNS 的 Policy 指派給 Full_Lambda_Role
角色。
Step2:接著我們一樣是要透過使用者 Andy
來建立 SNS Topic 所以我們要先把 SNS Policy 也指派給 DE Group 使用。
Step3:再來透過服務搜尋處找到 SNS 服務,並進入服務頁面
Step4:接著我們來建立 Topic
Step5:Topic 設定
anime-etl-alert
以上流程即完成 Topic 的建立,接下來我們要來建立 Subscription。
Step1:進入訂閱頁面
Step2:Subscription 設定
Step3:到剛剛設定的訂閱者 Email 查看有無收到驗證信,如沒問題就點選 「Confirm subscription」
Step4:點選後就會跳轉到成功訂閱的通知頁面
以上即完成 Subscription 的建立,接著我們要來修改 Lambda 讓他可以觸發 SNS 來通知訂閱者 Email。
Step1:修改 Lambda:check_files_and_trigger_workflow
Python 語法:
import boto3
import datetime
import json
s3 = boto3.client("s3")
glue = boto3.client("glue")
sns = boto3.client("sns")
BUCKET_NAME = "anime-lake"
WORKFLOW_NAME = "wf_animes_summary"
SNS_TOPIC_ARN = "arn:aws:sns:ap-east-2:<account_id>:anime-etl-alert"
def lambda_handler(event, context):
today = datetime.date.today().strftime("%Y-%m-%d")
print(f"🔍 Checking files for date: {today}")
expected_files = [
f"Bronze/animes/{today}/animes.csv",
f"Bronze/ratings/{today}/ratings.csv"
]
missing_files = []
# 🔎 檢查 S3 檔案存在與否
for key in expected_files:
try:
s3.head_object(Bucket=BUCKET_NAME, Key=key)
print(f"✅ Found: {key}")
except s3.exceptions.ClientError:
print(f"❌ Missing: {key}")
missing_files.append(key)
# ✅ 若所有檔案皆存在 → 觸發 Glue Workflow
if not missing_files:
try:
response = glue.start_workflow_run(Name=WORKFLOW_NAME)
run_id = response["RunId"]
print(f"🚀 Started Glue Workflow: {run_id}")
# SNS 成功通知
message = {
"status": "success",
"date": today,
"workflow_name": WORKFLOW_NAME,
"workflow_run_id": run_id,
"message": "All files found, Glue Workflow triggered successfully."
}
sns.publish(
TopicArn=SNS_TOPIC_ARN,
Subject=f"✅ Glue Workflow Triggered for {today}",
Message=json.dumps(message, indent=2)
)
print("📨 SNS success notification sent.")
return {"statusCode": 200, "body": f"Workflow started for {today}"}
except Exception as e:
# SNS 失敗通知(執行 Glue Workflow 發生例外)
error_message = {
"status": "failed",
"date": today,
"workflow_name": WORKFLOW_NAME,
"error": str(e)
}
sns.publish(
TopicArn=SNS_TOPIC_ARN,
Subject=f"❌ Glue Workflow Failed for {today}",
Message=json.dumps(error_message, indent=2)
)
print(f"🛑 Error starting Glue Workflow: {e}")
return {"statusCode": 500, "body": f"Error: {str(e)}"}
# ⚠️ 若有缺失檔案 → 跳過並通知 SNS
else:
warning_message = {
"status": "skipped",
"date": today,
"missing_files": missing_files,
"message": "Some files are missing. Workflow not triggered."
}
sns.publish(
TopicArn=SNS_TOPIC_ARN,
Subject=f"⚠️ Missing Files Detected for {today}",
Message=json.dumps(warning_message, indent=2)
)
print("⚠️ SNS warning notification sent (missing files).")
return {"statusCode": 200, "body": f"Missing files: {', '.join(missing_files)}"}
Step2:接著使用 Lambda 的測試功能來做測試,看看訂閱者 Email 是否有正常收到通知訊息
Step3:成功觸發 Lambda 後,我們可以看到 Email 有正常收到 AWS 通知 Glue ETL 的執行
# SNS 成功通知
message = {
"status": "success",
"date": today,
"workflow_name": WORKFLOW_NAME,
"workflow_run_id": run_id,
"message": "All files found, Glue Workflow triggered successfully."
}
Step4:當改寫 Lambda 後,也需要再去確認一下後續的流程有無正常執行,所以我們來查看一下 Glue Monitor,看起來是有正常運作的。
Step5:接著我們來看看失敗的通知會是什麼內容,我們可以將 S3 上當天的資料檔案刪除,在重新執行一次 Lambda 測試
以上即為 Lambda 結合 SNS 可以做到的通知 Lambda 成功或失敗的效果,是不是非常便利壓?
透過本篇的實作,我們已經讓整個 EventBridge → Lambda → Glue Workflow 的排程自動化流程更加完整。
並藉由 Amazon SNS 的整合,讓系統具備「自我回報」的能力:
這樣的設計不僅符合 生產環境的監控需求,
也能大幅減少手動檢查、重跑的成本。
💡 建議:
- 可以進一步將 SNS 結合 CloudWatch Alarm,在 Lambda 發生錯誤時自動通知。
- 若團隊使用 Slack,可再串接 AWS Chatbot,讓通知直接發送至 Slack 頻道。
- 若 Workflow 複雜,可考慮在 SNS 訊息中附加更多 metadata(例如檔案大小、ETL 時間等)。
整體來說,本篇的設計已經達到「可觀測、可維運、可自動回報」的目標,這也是邁向 生產級 Lakehouse Pipeline 的重要一步。
在下一篇 「Day23 淬鍊之章-資料補跑機制 Backfill 實作篇」 中,我們將延伸今天的內容,讓整個 Pipeline 具備:
這將讓你的 Data Lakehouse 流程更具彈性與穩定性。